#include "gd32f4xx.h"
#include "systick.h"
#include "bsp_uart.h"
#include "delay.h"
#include <stdio.h>

int main(void)
{
	systick_config();  /* 系统滴答配置 */
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);  /* 中断优先级分组,这里分组4:抢占16bit从0bit */
	bsp_uart_periph_init();  /* 初始化串口外设 */
	while(1) 
	{	
		printf("2004.04.18\r\n");
		printf("1972.05.17\r\n");
		delay_ms(4000);
		if(Receive_Ok == 1)
		{
			Receive_Ok = 0;  /* 重置接收完成标志位 */
			printf("MCU Receive Data is/are:\r\n");
			for(unsigned char i = 0; i < Data_Length; i++)
			{
				usart_data_transmit(USART0, Receive_Buff[i]);
				/* 等待发送完成,必须要有,否则会因速度过快导致发送失败 */ 
				while(usart_flag_get(USART0, USART_FLAG_TBE) == RESET);
			}					
			Send_Ok = 1;            /* 发送完成 */
			Data_Length = 0;        /* 清空数据长度 */
			printf("\r\nSend Over!");  /* 本次发送结束 */
		}	
	}
}

void USART0_IRQHandler(void)
{
	if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET)  /* 串口读数据缓冲区非空 */
	{
		Receive_Buff[Data_Length] = usart_data_receive(USART0);  /* 将每一位数据存储到缓冲区 */
		Data_Length++;  /* 数据长度增加 */
	}
	if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE) != RESET)  /* 串口空闲中断 */
	{
		//		usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);	/* 实测这个方法不能清除空闲中断标志位 */
		usart_data_receive(USART0);  /* 必须使用读数据来清除空闲中断标志位 */
		printf("Receive Over! Data_Length:%d\r\n", Data_Length);
		Receive_Ok = 1;  /* 本次接收全部完成,可以进行发送操作 */
	}
}
